package m2_work;


import com.rabbitmq.client.Channel;
import com.rabbitmq.client.Connection;
import com.rabbitmq.client.ConnectionFactory;
import com.rabbitmq.client.MessageProperties;


import java.util.Scanner;

//工作模式---生产者
public class Producer {

    public static void main(String[] args) throws Exception{

        //1.建立连接工厂，连接，通道
        ConnectionFactory f = new ConnectionFactory();
        f.setHost("192.168.64.140");
        f.setPort(5672);
        f.setUsername("admin");
        f.setPassword("admin");

        Connection conn = f.newConnection();

        Channel ch = conn.createChannel();

        //2.定义队列  (如果服务器中已经有这么个队列了，就直接用。如果服务器中还没有，就新建一个这样的队列)
//        ch.queueDeclare("HelloWorld",
//                        false, //这个队列是否持久：即mq服务器重启后，这个队列是否还在服务器中，false表示不持久
//                        false, //这个队列是否排它：即这个队列是不是只能1个消费者来使用，如果是true，就表示排它，只能1个消费者使用
//                        false, //如果没有消费者从这个队列获取消息了，mq服务器是否把这个队列自动删除。false表示，不管还有没有消费者用这个队列，这个队列会一直在
//                        null);//其他属性。如果这个队列要设置其他属性，就设置成一个Map对象，把对象放进这里。

        //2.1 定义一个新队列，持久化的
        ch.queueDeclare("task_queue",
                        true,  //开启队列持久化
                        false,  //不让消费者独占
                        false,  //没有消费者了，这个队列也不删除
                        null);   //没有其他属性

        //3.向队列中不断地发送数据
        //为方便测试，用一个死循环
        while(true){
            System.out.println("输入消息： ");
            String msg = new Scanner(System.in).nextLine();

            //如果输入exit，控制台中的数据界面就会退出
            if("exit".equals(msg)){
                break;
            }

            //3.1生产者向这个队列中存入数据
//            ch.basicPublish("",
//                            "HelloWorld",
//                            null,
//                             msg.getBytes());//是要把这条消息发到队列中，当然，这条消息可以有一些属性。属性跟消息封装好后再发出去。

            //设置队列中的 消息 也持久化
            ch.basicPublish("",
                            "task_queue",
                        MessageProperties.PERSISTENT_TEXT_PLAIN,  //将消息持久化的配置
                        msg.getBytes("UTF-8"));

            System.out.println("消息已发送： "+msg);
        }

        //关闭连接   --只有加上上面的if语句 这句才可能被执行到
        conn.close();

    }


}
